/*!
 * @file color.hh
 * @brief Klasa kolor + kilka predefiniowanych kolorów.
 */

#ifndef __ENGINE_BASIC_COLOR_HH
#define __ENGINE_BASIC_COLOR_HH

/*!
 * @brief Predefiniowane kolory - czerwony
 */
#define color_red 		color(1.0, 0.0, 0.0)

/*!
 * @brief Predefiniowane kolory - zielony
 */
#define color_green 	color(0.0, 1.0, 0.0)

/*!
 * @brief Predefiniowane kolory - niebieski
 */
#define color_blue 		color(0.0, 0.0, 1.0)

/*!
 * @brief Predefiniowane kolory - żółty
 */
#define color_yellow 	color(1.0, 1.0, 0.0)

/*!
 * @brief Predefiniowane kolory - różowy
 */
#define color_pink 		color(1.0, 0.0, 1.0)

/*!
 * @brief Predefiniowane kolory - turkusowy
 */
#define color_cyan 		color(0.0, 1.0, 1.0)

/*!
 * @brief Predefiniowane kolory - biały
 */
#define color_white 	color(1.0, 1.0, 1.0)

/*!
 * @brief Predefiniowane kolory - czarny
 */
#define color_black 	color(0.0, 0.0, 0.0)

/*!
 * @brief Kolor postaci RGBA
 */
class color {
public:
	/*!
	 * @brief Konstruktor. Tworzy kolor (0,0,0,1)
	 * @return Obiekt
	 */
	color();

	/*!
	 * @brief Konstruktor. Tworzy kolor (r,g,b,1)
	 * @param r Czerwony
	 * @param g Zielony
	 * @param b Niebieski
	 * @return Obiekt
	 */
	color(float r, float g, float b);

	/*!
	 * @brief Konstruktor. Tworzy kolor (r,g,b,a)
	 * @param r Czerwony
	 * @param g Zielony
	 * @param b Niebieski
	 * @param a Kanał alpha
	 * @return Obiekt
	 */
	color(float r, float g, float b, float a);

	/*!
	 * @brief Mnożenie wartości r,g,b,a przez zadaną l.
	 * Po mnożeniu dokonywana jest normalizacja.
	 * @param l Wartość dla mnożenia
	 * @return Nowy kolor
	 */
	color operator *(float l) const;

	/*!
	 * @brief Dodawanie dwóch kolorów do siebie. Następnie normalizacja.
	 * @param p Inny kolor
	 * @return Nowy kolor
	 */
	color operator +(color p) const;

	/*!
	 * @brief Odejmowanie dwóch kolorów od siebie. Następnie normalizacja.
	 * @param p Inny kolor
	 * @return Nowy kolor
	 */
	color operator -(color p) const;

	/*!
	 * @brief Normalizacja [wartości > 1 stają się 1,
	 * a < 0 stają się 0].
	 */
	void normalize();

	/*!
	 * @brief Czerwony [prawidłowo - wartosci <0, 1> ]
	 */
	float r;

	/*!
	 * @brief Zielony [prawidłowo - wartosci <0, 1> ]
	 */
	float g;

	/*!
	 * @brief Niebieski [prawidłowo - wartosci <0, 1> ]
	 */
	float b;

	/*!
	 * @brief Kanał alpha [prawidłowo - wartosci <0, 1> ]
	 */
	float a;
};

#else
class color;
#endif
